Use a member when you can, and a friend when you have to.
Like in real life, my family members have certain privileges that my friends do not have (ex: my family members inherit from me, but my friends do not, etc). To grant privileged access to a function, you need either a friend or a member; there is no additional loss of encapsulation one way or the other. Sometimes friends are syntactically better (ex: in class 'X', friend fns allow the 'X' param to be second, while members require it to be first). Another good use of friend functions are the binary infix arithmetic operators. Ex: 'aComplex + aComplex' probably should be defined as a friend rather than a member, since you want to allow 'aFloat + aComplex' as well (members don't allow promotion of the left hand arg, since that would change the class of the object that is the recipient of the message).